#include <iostream>
#include "Thread.hpp"
#include <unistd.h>
#include <vector>
#include <mutex>

using namespace ThreadMoudle;

const int N = 20;

int ticketnum = 10000;

// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


std::mutex gmtx;

// cpp库
class ThreadData
{
public:
    std::string _name;
    // pthread_mutex_t *lock_ptr;
};



void Ticket(ThreadData data)
{
    while(true)
    {
        gmtx.lock();
        if(ticketnum > 0)
        {
            usleep(1000);
            
            std::cout<<"i am "<<data._name<<",i got ticket="<<ticketnum<<std::endl;
            ticketnum--;
            gmtx.unlock();

            usleep(1000);
        }
        else 
        {
            gmtx.unlock();
            break;
        }
            
    }
}


int main()
{
    std::vector<Thread<ThreadData>> threads;
    

    for(int i= 1; i<= N; ++i)
    {
        threads.emplace_back(Thread<ThreadData>(Ticket,{"thread-"+std::to_string(i)}));
    }
    for(auto& t : threads)
    t.Start();


    sleep(5);
    
    for(auto& t : threads)
    {
        std::cout<<"join "<<t.Name()<<" = "<<t.Join()<<std::endl;
    }

    return 0;
}



// POSIX库——Portable Operating System Interface for UNIX
// class ThreadData
// {
// public:
//     std::string _name;
//     pthread_mutex_t *lock_ptr;
// };



// void Ticket(ThreadData data)
// {
//     while(true)
//     {
//         // pthread_mutex_lock(&mutex);
//         pthread_mutex_lock(data.lock_ptr);
//         if(ticketnum > 0)
//         {
//             usleep(1000);
            
//             std::cout<<"i am "<<data._name<<",i got ticket="<<ticketnum<<std::endl;
//             ticketnum--;
//             pthread_mutex_unlock(data.lock_ptr);

//             // pthread_mutex_unlock(&mutex);


//             usleep(1000);
//         }
//         else 
//         {
//             pthread_mutex_unlock(data.lock_ptr);
    
//             // pthread_mutex_unlock(&mutex);
//             break;
//         }
            
//     }
// }


// int main()
// {
//     std::vector<Thread<ThreadData>> threads;
//     pthread_mutex_t gmtx;
//     pthread_mutex_init(&gmtx,nullptr);


//     for(int i= 1; i<= N; ++i)
//     {
//         threads.emplace_back(Thread<ThreadData>(Ticket,{"thread-"+std::to_string(i),&gmtx}));
//     }
//     for(auto& t : threads)
//     t.Start();

//     // v[3].Detach();

//     sleep(5);
    
//     for(auto& t : threads)
//     {
//         std::cout<<"join "<<t.Name()<<" = "<<t.Join()<<std::endl;
//     }

//     return 0;
// }



